#20级互金
'''
面向对象 面向朝向  对面  形象（描述清楚特征（变量）和行为（函数））
     1.抽象 抽取的形象（提取的形象），灵长类就是人提取了 人 猩 猴子等动物的共同特征（数量比例位置）和行为
     2.封装 封闭 装入，装箱子，用类名表示一系列特征和行为的组合，每次使用只能访问一个特征（只能开箱子拿其中一个）
     3.继承 现实世界中，可以儿女可以继承父母的物品的使用权和所有权，父类型的变量和方法可以由子类型继承（子类型不用定义就可以使用）
     4.多态 一个名称多种形态，鸟在跑，鸭子在跑 鸡在跑 鸵鸟在跑都可以是鸟在跑，不同子类的同名行为可以由父类同名行为统一指代，但是形态不一
'''
#鸟类是父类
import math
class Bird:
    wingsn=2 #这里python识别到需要保存一个整数，所以在内存中开辟了一个能放最大整数的所需要空间，就是2 的32次方
             # 所以需要32个电子原件才能表示二进制的2的32次方
    legsnoo=2
    swimmingSpeed=0
#鸭子类是子类，继承了鸟类
class Duck(Bird):
    swimmingSpeed=0  #只有鸭子才有必要定义游泳的速度，所以游泳的速度不能定义给鸟类
duck=Duck
#print(duck.legsno) #鸭子有两条腿 是从鸟类这个父类继承而来
#车是父类 和  自行车和货车是子类
class Car:
    wheelsno=0
    speed=0
class Bike:
    bellstate=False
class Truck:
    trumpet=False
#水果是父类 和  苹果 香蕉是子类
class Fruit:
    price=0
    sweetness=0
    acidity=0
    color=''
class Apple(Fruit):
    girth=0
class Banana(Fruit):
    length=0

#衣物是父类 裤子 裙子 是子类
class Cloth:
    price=0
    weight=0
    material=0;
class Trousers(Cloth):
    legsWidth=0 #裤筒的宽度 只有裤子才关心
class Skirt(Cloth):
    hasTrain=False #只有裙子才关注是否有裙摆
def study():  #不属于类的函数 不需要传递默认的参数self self 当前函数所属于的对象
    pass

class Student:
    sno=0
    name=''
    studyDuring=0
    exerciseDuring=0
    hp=100
    #描述一个种类实例进行的行为 过程 功能  方法就需要定义函数  学习是学生的一个行为 学习是学生的一个过程 学习是学生的一个功能  学习是学生的一个办法
    #函数  函数名 返回  参数
    def study(self,currStudyDuring):
        print("学生在学习")
        self.studyDuring = self.studyDuring + currStudyDuring # 经过一轮学习之后，该名学生学习的总时长是原来的总时长加上本次学生的时长
    def exercise(self,currExerciseDuring):
        print("学生做锻炼")
        self.exerciseDuring = self.exerciseDuring + currExerciseDuring
        self.hp = self.hp - math.ceil(currExerciseDuring*0.6)

    def sleep(self, sleepDuring):
        print("学生睡觉")
        if self.hp + sleepDuring*2 >= 100:
            self.hp = 100
        else:
            self.hp = self.hp + sleepDuring * 2

student1=Student()
student1.study(1)
student1.study(2)
student1.exercise(20)
print("该名学生学习的总时长为:"+str(student1.studyDuring)+"小时")
print("该名学生锻炼的总时长为:"+str(student1.exerciseDuring)+"小时")
print("该名学生的体力值是:"+str(student1.hp))
student1.sleep(10)
print("该名学生的体力值是:"+str(student1.hp))

class Businessperson:
    money=0
    name=''
    def __init__(self,name,money):
        self.name = name
        self.money = money
    def buyShares(self,sharesName,no,cost):
        self.money = self.money - cost * no
        print("买入"+sharesName+"共计"+str(no)+",单价"+str(cost)+"，总计"+str(cost*no)+",余额"+str(self.money))
    def sellShares(self,sharesName,no,cost):
        self.money = self.money + cost * no
        print("卖出"+sharesName+"共计"+str(no)+",单价"+str(cost)+"，总计"+str(cost*no)+",余额"+str(self.money))

businessperson=Businessperson("阿里巴巴",1000)
businessperson.buyShares("郫县豆瓣",100,1)
businessperson.buyShares("金刚铁矿",100,5)
businessperson.sellShares("郫县豆瓣",50,2)
businessperson.sellShares("天天化工",30,2)
businessperson.sellShares("天天化工2",30,2)

#我们现在写的编程语言java python是高级语言是人类能够读懂的语言，但是cpu只认识机器语言（二进制）
#定义一个桌子类，计算机的认知是我要准备 3个32位连续的电子原件来存放 桌子长度 宽度 高度 才能在计算机中模拟出一个桌，
class Desk:
    high=0
    width=0
    length=0
    #函数 是不是一个 将 参数 和 本身的数据混合运算的过程
    '''
    所有的运算只有三种  1、数学运算  2、比较运算  3、逻辑运算
    天是星期三 要上三节课
    studty(week,courseno)  #方法的参数位置的变量是形式参数 只是占内存位置的，而在方法执行的时候 传递的具体值才是参与运算的实际参数
    如果 不做 加减乘除 不作比较 大于小于 那么这数据给计算机是为了让计算机帮你存储 self.high = high 赋值运算
    为什么要定义一个学习的方法，除了存储数据就是为了运算，如果我把传入的课程加上我以前学的课程总数  完成了数学运算
        self.courseno += courseno
        如果 我学习了超过2节课就要打瞌睡 我完成了比较运算
        if courseno >= 2:
           print('第三节以后就睡着了')
        else：
           print('正常学习')
        如果 我是多条件比较  逻辑运算  not and all
        if (age < 8 and course >=2) || (age >=8 and course > 4):
            print('第三节以后就睡着了')
        else：
           print('正常学习')
    '''

    def __init__(self,high=0,width=0,length=0): #python规定了类里面的方法需要  传递一个当前对象（自己）self，在调用的时候 不用写出，自动传入
        self.high = high
        self.width = width
        self.length = length

#但是 占住的这个三个电子原件空间 什么时候赋予真正的值，1.模板造出来 再赋值，2，造的时候就赋值
desk1=Desk()
desk1.high=60
desk1.length=60
desk1.width=40
desk2=Desk(60,40,60)
print(desk1.width)
print(desk2.width)
#抽象（父类）  具象（子类）
class Elc:
    brandName = ''
    price = 0


#张三 用手机玩王者荣耀，李四用电脑玩王者荣耀
class Phone(Elc):
    fontCamerPX = 0
    backCamerPX = 0  # 前置摄像头像素
    def __init__(self,brandName,price,fontCamerPX,backCamerPX):
        self.brandName = brandName
        self.price = price
        self.fontCamerPX = fontCamerPX
        self.backCamerPX = backCamerPX
    def playGame(self,person):
        print(person.name+"用"+self.brandName+"手机打游戏")
class Computer(Elc):
    fontCamerPX = 0  # 前置摄像头像素
    def __init__(self,brandName,price,fontCamerPX):
        self.brandName = brandName
        self.price = price
        self.fontCamerPX = fontCamerP
    def playGame(self,person):
        print(person.name+"用"+self.brandName+"电脑打游戏")
class Person:
    name=''
    def __init__(self,name):
        self.name = name
    def playGame(self,elc): # 打游戏是人的行为 所以给人定义函数，但是人自己不能光靠自己打游戏，需要提供一部电子产品，需要传参数
        elc.playGame(self)
phone=Phone("华为",5000,1400,2000)
computer=Computer("dell g15",6000,1400)
person=Person("张三")
person.playGame(phone)

'''
类定义出来 还要考虑类类 关系
      is  a 一个类的对象同时是另外一个类的对象  继承 鸭子也是鸟  鸡也是鸟  手机也是电子产品  电脑也是电子产品
      has a  一个类的对象包含另外一个类的对象，一个类的对象是另外一个类的组成部分 比如 汽车 和轮胎
      use a 使用关系，一个类使用另外一个类完成功能
'''

















